package com.dp.client.views.paquete;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


import com.dp.client.dto.ClienteDTO;
import com.dp.client.dto.Fecha;
import com.dp.client.dto.PaqueteDTO;
import com.dp.client.dto.PaqueteEnvio;
import com.dp.client.dto.RutasVueloEnvio;
import com.dp.client.dto.VueloEnvio;
import com.dp.client.servicios.MapaStatic.IServiciosMapaStatic;
import com.dp.client.servicios.MapaStatic.IServiciosMapaStaticAsync;
import com.dp.client.servicios.clientes.IServiciosCliente;
import com.dp.client.servicios.clientes.IServiciosClienteAsync;
import com.dp.client.servicios.paquete.IServiciosPaquete;
import com.dp.client.servicios.paquete.IServiciosPaqueteAsync;
import com.dp.client.servicios.simulacion.IServiciosSimulacion;
import com.dp.client.servicios.simulacion.IServiciosSimulacionAsync;
import com.dp.client.util.Alerts;
import com.dp.client.views.StaticMap.MapaEstatico;
import com.dp.client.views.clientes.WizardStage;
import com.dp.server.backend.PaqueteBackend;
import com.dp.server.backend.RutaDeVueloBackend;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.CaptionPanel;

public class SeleccionarRutas extends Composite implements WizardStage{
	private FlexTable rutasTable;
	private  DatosEnvioPaquete datos;
	private RadioButton rdbSeleccion;
	private boolean seleccion=false;
	private SimplePanel panelito = new SimplePanel();
	MapaEstatico mapa=new MapaEstatico();
	public SeleccionarRutas(DatosEnvioPaquete datosPaquete) {
		datos=datosPaquete;
		CaptionPanel cptnpnlRutas = new CaptionPanel("Rutas");
		VerticalPanel vertical = new VerticalPanel();
		initWidget(vertical);
		vertical.add( cptnpnlRutas );
		vertical.setSize("420px", "auto");
		rutasTable = new FlexTable();
		cptnpnlRutas.setContentWidget(rutasTable);
		rutasTable.setSize("419px", "149px");
		rutasTable.setText(0,0,"longitud");
		rutasTable.setText(0, 1, "seleccionar");
		vertical.add( panelito );
		panelito.add(mapa);
	}


	public void llenarRutas(){
		limpiarTabla();
		IServiciosSimulacionAsync serviciosSimulacion = GWT.create(IServiciosSimulacion.class);
		
		PaqueteEnvio paqueteEnvio=new PaqueteEnvio();
		paqueteEnvio.setAlmacenOrigenNombre(datos.getOrigen().getDescripcion());
		//paquete.setAlmacenOrigenNombre("Lima");
		paqueteEnvio.setAlmacenDestinoNombre(datos.getDestino().getDescripcion());
		//paquete.setAlmacenDestinoNombre("asdfasdf");
		Date d= new Date();
		paqueteEnvio.setSalida(d);
		datos.setPaqueteEnvio(paqueteEnvio);
		serviciosSimulacion.obtenerRutas(paqueteEnvio, new AsyncCallback<List<RutasVueloEnvio>>() {
			@Override
			public void onSuccess(List<RutasVueloEnvio> result) {
		
				setTablaRutas(result);
				
			}
			@Override
			public void onFailure(Throwable caught) {
				
				Alerts.dialogErrorConexion();
			}
		});
	}
	
	protected void setTablaRutas(List<RutasVueloEnvio> result) {
		limpiarTabla();
		if (result.size()==0)
			rutasTable.setText(0, 1, "No hay rutas disponibles");
		for (final RutasVueloEnvio rutas:result){
			int row = rutasTable.getRowCount();
			String cad="";
			for ( VueloEnvio v : rutas.vuelos){
				cad+=" ciudad : "+v.descripcion;
			}
			cad+=" | destino : "+datos.getDestino().getCiudad().getNombre();
			rutasTable.setText(row, 0, cad);
			rdbSeleccion = new RadioButton("ff");
			rdbSeleccion.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					//Alerts.crearAlerta(" ff "+rutas.vuelos.size());
					seleccion=true;
					datos.setRutas(rutas);
					dibujarRuta(rutas);
					//ejecutarRuta();
 				}
			});
			rutasTable.setWidget(row, 1, rdbSeleccion);
		}
		
		
		//hor.add(rdbSeleccion);
	}
	protected void dibujarRuta(RutasVueloEnvio rutas) {
		IServiciosMapaStaticAsync serviciosMapaStatic = GWT.create(IServiciosMapaStatic.class);
		serviciosMapaStatic.getRutaVuelo(rutas, new AsyncCallback<String>(){
			@Override
			public void onSuccess(String url) {
				mapa.cargarURl(url,-1);
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}


	protected void ejecutarRuta() {
		
		IServiciosSimulacionAsync serviciosSimulacion = GWT.create(IServiciosSimulacion.class);
		serviciosSimulacion.ejecutaRuta(datos.getRutas(), datos.getPaqueteEnvio(), new AsyncCallback<Boolean>(){
			@Override
			public void onSuccess(Boolean result) {
				
				datos.setFunciono(result);
				seleccion=result;
				if (!result)
					Alerts.dialogErrorPersonalizado("No se pudo asignar la ruta");
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
		
	}


	@Override
	public boolean isValid() {
		ejecutarRuta();
		return seleccion;
	}
	@Override
	public String getError() {
		
		return "Debe seleccionar una ruta";
	}

	@Override
	public void clear() {
		limpiarTabla();
		mapa.clear();
		seleccion=false;
	}

	private void limpiarTabla() {
		for (; rutasTable.getRowCount() > 0; ) {
			   rutasTable.removeRow(0);
			}
	}


	@Override
	public void actualizar() {
		llenarRutas();
		mapa.clear();
	}
	@Override
	public Widget getWidget(){
		return this;
	}
}
